package com.example.springaidemo.config;

import com.example.springaidemo.controller.case4.ChatRedisMemory;
import com.example.springaidemo.controller.case6.MathService;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.ai.tool.method.MethodToolCallbackProvider;
import org.springframework.ai.zhipuai.ZhiPuAiChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;

/**
 * @author stone
 * @date 2025/6/27 9:29
 */
@Configuration
public class AIChatConfig {

    /**
     * 参数-占位符的默认系统文本
     */
    @Bean
    public ChatClient paramTextChatClient(ZhiPuAiChatModel chatModel) {
        return ChatClient.builder(chatModel)
                .defaultSystem("你是一个智能聊天机器人，用 {role} 的角度回答问题")
                .build();
    }

    /**
     * 默认系统文本
     */
    @Bean
    public ChatClient defaultTextChatClient(ZhiPuAiChatModel chatModel) {
        return ChatClient.builder(chatModel)
                .defaultSystem("你是一个智能聊天机器人，用邪恶女巫的角度回答问题")
                .build();
    }

    /**
     * 默认client
     */
    @Bean
    public ChatClient zhiPuAiChatClient(ZhiPuAiChatModel chatModel) {
        return ChatClient.create(chatModel);
    }

    /**
     * 基于redis的对话记忆
     */
    @Bean
    public ChatMemory chatMemory(RedisTemplate<String, Object> redisTemplate) {
        return new ChatRedisMemory(redisTemplate);
    }

    /**
     * 注册为mcp的工具：允许服务器公开可由语言模型调用的工具
     * <p>
     * ToolCallbackProvider+@Tools=mcp服务工具定义
     *
     */
    @Bean
    public ToolCallbackProvider mathTools(MathService mathService) {
        return MethodToolCallbackProvider.builder()
                .toolObjects(mathService)
                .build();
    }
}
